package com.sh.令牌桶算法;

import com.sh.RateLimiter;

/**
 * 令牌桶算法
 * @author sh
 */
public class TokenBucketLimiter implements RateLimiter {
    private long timeStamp = System.currentTimeMillis(); // 上一次水进桶的时间
    private long capacity = 100;   // 桶的容量
    private long rate = 5;  // 每100毫秒放多少  放令牌速度
    private long tokens = 10; // 当前的牌

    public TokenBucketLimiter(long capacity, long rate) {
        this.capacity = capacity;
        this.rate = rate;
    }

    /**
     * 判断是否可以获取令牌
     * @return 如果可以获取令牌返回 true，否则返回 false
     */
    @Override
    public synchronized boolean limit() {
        long now = System.currentTimeMillis();
        // 计算自上一次时间戳以来新生成的令牌数量
        long newTokens = ((now - timeStamp) / 100L) * rate;
        System.out.println( "newTokens:"+newTokens );
        // 更新令牌数量，确保不超过桶的容量
        tokens = Math.min(capacity, tokens + newTokens);
        timeStamp = now;
        if (tokens > 0) {
            tokens--;
            return true;
        } else {
            return false;
        }
    }


}
